/**
 * TinyURL 是一种 URL 简化服务， 比如：当你输入一个 URL https://leetcode.com/problems/design-tinyurl 时，它将返回一个简化的URL http://GH.com/4e9iAk 。请你设计一个类来加密与解密 TinyURL 。

加密和解密算法如何设计和运作是没有限制的，你只需要保证一个 URL 可以被加密成一个 TinyURL ，并且这个 TinyURL 可以用解密方法恢复成原本的 URL 。

实现 Solution 类：

Solution() 初始化 TinyURL 系统对象。
String encode(String longUrl) 返回 longUrl 对应的 TinyURL 。
String decode(String shortUrl) 返回 shortUrl 原本的 URL 。题目数据保证给定的 shortUrl 是由同一个系统对象加密的。
 */

// hash函数
/**
 * Encodes a URL to a shortened URL.
 *
 * @param {string} longUrl
 * @return {string}
 */
var encode = function (longUrl) {
  const k1 = 1117
  const k2 = 1000000007
  this.dataBase = new Map()
  this.urlTokey = new Map()

  if (this.urlTokey.has(longUrl)) {
    return "http://GH.com/" + this.urlToKey.get(longUrl);
  }
  let key = 0, base = 1
  for (let i = 0; i < longUrl.length; i++) {
    const c = longUrl[i]
    key = (key + c.charCodeAt() * base) % k2
  }
  // 哈希冲突， 链表， 轮询都可以解决
  while (dataBase.has(key)) {
    key = (key + 1) % K2;
  }
  dataBase.set(key, longUrl);
  urlTokey.set(longUrl, key);
  let res = "http://GH.com/" + key
  console.log(res);
  return "http://GH.com/" + key;
};

/**
 * Decodes a shortened URL to its original URL.
 *
 * @param {string} shortUrl
 * @return {string}
 */
var decode = function (shortUrl) {
  const p = shortUrl.lastIndexOf('/') + 1;
  const key = parseInt(shortUrl.substring(p));
  console.log(this.dataBase.get(key));
  return this.dataBase.get(key);
};

encode("https://leetcode.com/problems/design-GH")
decode('http://GH.com/4349')

/**
 * Your functions will be called as such:
 * decode(encode(url));
 */